package table_Mixage;

/**
 *  Player Piste
 *
 *	Description: Classe principale, crée le JPanel de chaque pistes.
 *	
 *	Contenu:
 *		- JButon dans JPanel outils
 *		- JTextFields dans JPanel infos
 *		
 * @author Damien Deldon</a>
 * @version 1.0
 */
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

public class PlayerPiste extends JPanel {
	
	private static final long serialVersionUID = 2564695165702642566L;
	
	private Lecture lecture = new Lecture();
	private Piste piste;
	private File file;
	private ArrayList<PlayerCanal> canaux= new ArrayList<PlayerCanal>();
	private JLabel freq;
	private JLabel reso;
	private JLabel nom;
	private JPanel grilleCanaux = new JPanel();
	private Stop stop = new Stop();
	private int numPiste;
	
	static int nbPiste;
	
	static int [] tabech;
	static int importerFrequence = 0;
	static int importerResolution = 0;
	static int importerNbCanaux = 0;
			
	public PlayerPiste(Piste p){
		
		this.setBorder(new javax.swing.border.BevelBorder(BevelBorder.LOWERED));
		numPiste = nbPiste;
		piste = p;
//Contenu du JPanel
	//Bouton Ouvrir
		JButton open = new JButton(new ImageIcon(getClass().getResource("/ouvrir.jpg")));
		open.setToolTipText("Ouvrir");
		open.setPreferredSize(new Dimension(40,43));
		open.addActionListener(new OpenListener(new PlayerCanal(piste,false)));

	//Bouton Lecture Pause
		JButton play = new JButton(new ImageIcon(getClass().getResource("/playpause.jpg")));
		play.setToolTipText("Lecture / Pause");
		play.setPreferredSize(new Dimension(40,40));
		play.addActionListener(new PlayListener(canaux));
	
	//Bouton Stop
		JButton stop = new JButton(new ImageIcon(getClass().getResource("/stop.jpg")));
		stop.setToolTipText("Stop");
		stop.setPreferredSize(new Dimension(40,40));
		stop.addActionListener(new StopListener());
		
	//Bouton Volume +
		JButton volUp = new JButton(new ImageIcon(getClass().getResource("/volplus.jpg")));
		volUp.setToolTipText("Augmenter Volume");
		volUp.setPreferredSize(new Dimension(40,40));
		volUp.addActionListener(new VolUpListener());
						
	//Bouton Volume -
		JButton volDown = new JButton(new ImageIcon(getClass().getResource("/volmoins.jpg")));
		volDown.setToolTipText("Diminuer Volume");
		volDown.setPreferredSize(new Dimension(40,40));
		volDown.addActionListener(new VolDownListener());
		
	//Bouton Fréquence +
		JButton freqUp = new JButton(new ImageIcon(getClass().getResource("/frequp.jpg")));
		freqUp.setToolTipText("Accélérer");
		freqUp.setPreferredSize(new Dimension(40,40));
		freqUp.addActionListener(new FreqUpListener());
				
	//Bouton Fréquence -
		JButton freqDown = new JButton(new ImageIcon(getClass().getResource("/freqdown.jpg")));
		freqDown.setToolTipText("Ralentir");
		freqDown.setPreferredSize(new Dimension(40,40));
		freqDown.addActionListener(new FreqDownListener());
		
	//Bouton Supprimer Piste
		JButton delPiste = new JButton(new ImageIcon(getClass().getResource("/supprimer.jpg")));
		delPiste.setToolTipText("Supprimer la piste");
		delPiste.setPreferredSize(new Dimension(40,40));
		delPiste.addActionListener(new DelPisteListener());
		
	//Bouton Sauvegarder Piste
		JButton savePiste = new JButton(new ImageIcon(getClass().getResource("/enregistrer.jpg")));
		savePiste.setToolTipText("Sauvegarder la piste");
		savePiste.setPreferredSize(new Dimension(40,40));
		savePiste.addActionListener(new SavePisteListener(piste));
		
	//Bouton Ajout Canal Piste
		JButton addCanal = new JButton(new ImageIcon(getClass().getResource("/add.jpg")));
		addCanal.setToolTipText("Ajouter un canal");
		addCanal.setPreferredSize(new Dimension(45,40));
		addCanal.addActionListener(new AddCanalListener());
	
	//Panel outils	
		GridLayout layoutOutils = new GridLayout(2,5);
		layoutOutils.setHgap(5);
		layoutOutils.setVgap(5);
		JPanel outils = new JPanel(layoutOutils);
		outils.add(open);
		outils.add(play);
		outils.add(stop);
		outils.add(volUp);
		outils.add(freqUp);
		outils.add(delPiste);
		outils.add(savePiste);
		outils.add(addCanal);
		outils.add(volDown);
		outils.add(freqDown);
		
	//Panel information
		JPanel panelInfos = new JPanel(new GridLayout(3,1));
		panelInfos.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
	//Nom du fichier
		nom = new JLabel("Nom du fichier");
		panelInfos.add(nom);
		
	//Fréquence
		freq = new JLabel("Fréquence");
		panelInfos.add(freq);
		
	//Résolution
		reso = new JLabel("Résolution");
		panelInfos.add(reso);
		
		JPanel outils_info = new JPanel(new BorderLayout(0,10));
		
		outils_info.add(panelInfos,BorderLayout.NORTH);
		outils_info.add(outils,BorderLayout.CENTER);
		
		this.add(outils_info);
	
	//Canaux
		grilleCanaux.add(canaux.get(0));
		grilleCanaux.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
		this.add(grilleCanaux);
	}

//Classes Action
	
//Action bouton ouvrir	
	class OpenListener implements ActionListener {
					
		public OpenListener(PlayerCanal p){
			super();
			canaux.add(p);
		}
			
		public void actionPerformed(ActionEvent arg0){
			
			file = Open();
			piste = new Piste();
			
			
			
			if (file != null){
				String tmp[]=file.getAbsolutePath().split("\\.");
				String extension = tmp[tmp.length-1];
				int j = 0;
				if (extension.equals("wav")){
					j = 1;
				}
				if (extension.equals("raw")){
					j = 2;
				}	
				switch (j) {
				case 1: piste=piste.loadFromWavFile(file.getAbsolutePath());break;
				case 2:	@SuppressWarnings("unused")
						ImportRaw importraw = new ImportRaw(Mixeur_RIE07.fenetre, "Importer", "Choix des paramètres:");
						if (importerFrequence != 0 && importerNbCanaux != 0 && importerResolution != 0){
							piste=piste.loadFromRawFile(file.getAbsolutePath(), importerNbCanaux, importerFrequence, importerResolution);
						};break;
				default:System.out.println("Fichier non supporter");
				}
		
			//Nom
				nom.setText("Nom du fichier : " + file.getName());
			//Fréquence
				freq.setText("Fréquence : " + Integer.toString(piste.getFrequence()) + " Hz");
					
			//Résolution
				reso.setText("Résolution : " + Integer.toString(piste.getResolution()));
				
			//Cannaux
				
				GridLayout layoutGrille = new GridLayout(piste.getNbCanaux(),1);
				layoutGrille.setVgap(15);
				grilleCanaux.setLayout(layoutGrille);
				for (int i = 0;i < piste.getNbCanaux();i++){
					//Gestion du bug quand on ouvre une seconde fois
					if (canaux.size() > piste.getNbCanaux()-1){
						grilleCanaux.removeAll();
						canaux.removeAll(canaux);
						canaux.add(new PlayerCanal(piste,false));
					}
					//Si plusieur canal
					if(i>0){
						canaux.add(new PlayerCanal(piste,false));
					}
					//Mise à jour du graph
					canaux.get(i).setPiste(piste);
					canaux.get(i).graph.setPiste(piste);
					canaux.get(i).graph.setNumCanal(i);
					grilleCanaux.add(canaux.get(i));
				}
			}
		}
	}
//Choix du fichier
	protected File Open() {
		JFileChooser open = new JFileChooser();		
		open.showOpenDialog(null);
		file = open.getSelectedFile();
		return file;
	}	

//Action bouton lecture/pause
	class PlayListener implements ActionListener {
		
		//public boolean lecture = false;
		Pause pause = new Pause();
		ArrayList<PlayerCanal> canaux;
				
		public PlayListener(ArrayList<PlayerCanal> p){
			super();
			this.canaux = p;
		}
				
		public void actionPerformed(ActionEvent arg0){
			if (file != null){
				stop.setStop(false);				
				if(lecture.getMP().lectureFini){
					lecture = new Lecture();
					lecture.setPiste(piste);
					lecture.setPause(pause);
					lecture.setGraph(canaux);
					lecture.setStop(stop);
					lecture.start();
				}else{
					pause.setPause();
				}
			}else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

//Action bouton stop
	class StopListener implements ActionListener {
				
		public void actionPerformed(ActionEvent arg0){
			if (file != null){
				if(!stop.getStop()){
					stop.setStop(false);
				}
				stop.setStop();
				for (int i = 0;i < piste.getNbCanaux();i++){
					canaux.get(i).graph.paintBarre(0);
				}
			}else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	
//Action bouton volume	
	class VolUpListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0){
			if (piste != null) {
				piste.controlVolume(1.1);
				for (int i = 0; i < piste.getNbCanaux();i++) {
					canaux.get(i).graph.updateUI();
				}
			}else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	class VolDownListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0){
			if (piste != null) {
				piste.controlVolume(0.9);
				for (int i = 0; i < piste.getNbCanaux();i++) {
					canaux.get(i).graph.updateUI();
				}
			}else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

//Action bouton fréqence
	class FreqUpListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0){
			if (piste != null) {
				piste.setFrequence(piste.getFrequence() + 500);
				for (int i = 0; i < piste.getNbCanaux();i++) {
					canaux.get(i).graph.updateUI();
					freq.setText("Fréquence : " + Integer.toString(piste.getFrequence()) + " Hz");
				}
			}else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}	
		}
	}
	class FreqDownListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0){
			if (piste != null) {
				piste.setFrequence(piste.getFrequence() - 500);
				for (int i = 0; i < piste.getNbCanaux();i++) {
					canaux.get(i).graph.updateUI();
					freq.setText("Fréquence : " + Integer.toString(piste.getFrequence()) + " Hz");
				}
			}else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	
//Action bouton Supprimer piste
	class DelPisteListener implements ActionListener{
		@SuppressWarnings("static-access")
		public void actionPerformed(ActionEvent arg0){
			Mixeur_RIE07.fenetre.panel.remove(numPiste);
			Mixeur_RIE07.fenetre.panel.updateUI();
		}
	}

//Action bouton Enregistrer
	class SavePisteListener implements ActionListener {
			
		public SavePisteListener(Piste p){
			super();
			piste = p;
		}
				
		public void actionPerformed(ActionEvent arg0){
			if (piste !=null){
				File file;
				JFileChooser open = new JFileChooser();
				open.showSaveDialog(null);
				file = open.getSelectedFile();
				if (file != null){
					String tmp[]=file.getAbsolutePath().split("\\.");
					String extension = tmp[tmp.length-1];
					if (extension.equals("wav")){
						piste.saveToWavFile(file.getAbsolutePath(), 0, piste.getNbEch());
					}
					if (extension.equals("raw")){
						piste.saveToRawFile(file.getAbsolutePath(),0,piste.getNbEch());
					}
				}
			}	
			else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

//Action Bouton Ajouter Canal
	class AddCanalListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0){
			if (piste != null){
				piste.addCanal(new Canal(piste.getNbEch(),piste.getFrequence()));
				piste.refresh();
				for (int i = 0;i < piste.getNbCanaux();i++){
					grilleCanaux.setLayout(new GridLayout(piste.getNbCanaux(),1));
					if(i+1>canaux.size()){
						canaux.add(new PlayerCanal(piste, true));
					}
					canaux.get(i).graph.setPiste(piste);
					canaux.get(i).graph.setNumCanal(i);
					grilleCanaux.add(canaux.get(i));
				}
			}else{
				JOptionPane.showMessageDialog(null, "Aucune piste chargée", "Erreur", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
}
